#include "inserir.h"


int Le_PK(pNo_PK *obras, char *titulo, int nrr, int tamanho, int vetor) {
	if ((tamanho % 20 == 0) && tamanho != 0) 	 /* realoca memoria caso tamanho maximo seja atingido*/
		*obras = realloc (*obras,(20+(tamanho))*sizeof(No_PK)); 
	strcpy((*obras)[tamanho].titulo, titulo); /*insere no vetor obras e adiciona '/0' no fim do titulo*/
	(*obras)[tamanho].nrr = nrr;
	return tamanho+1; /* retorna o novo tamanho */
}

int Secondary(pNo_PK *obras, FILE *origem, FILE *destino, int tamanhostr,int *indice, int atual, int *tamanho)  {
	char titulo[201];
	size_t result;
	int x;
	char *p;
	fseek(origem, atual, SEEK_SET);
	result = fread (titulo,1,(200),origem); 
	titulo[200] = '\0';  /* recebe o titulo e o indice da obra*/
	p = strtok (titulo," ");	
        while (p) {
		*tamanho = Le_PK(&(*obras), p, *indice, *tamanho, tamanhostr);
		x = escreve (origem, destino, "", tamanhostr, atual);
		fputs("-1",destino);
		*indice = *indice + 1;
		printf("1");
		if (p = strtok (NULL," "));
	}
	return atual;
}

int main() {
	pNo_PK obras, sk_titulo, sk_autor, sk_tipo, sk_ano;
	int n = 0, i = 1, tamanho = 0, atual = 0; 
	char * buffer, * titulo, * indice;
	char tit[tam_titulo+1];
	size_t result;
	long lSize;
	int ititulo = 1, iautor = 1 , itipo = 1, iano = 1, tautor = 0, ttitulo = 0, ttipo = 0;
	FILE * nrr, * base, *pk_titulo, *pk_tipo, *pk_autor, *pk_ano, *sk ;
	obras = malloc((sizeof(No_PK)*20)); 
	sk_titulo = malloc((sizeof(No_PK)*20)); 
	sk_tipo = malloc((sizeof(No_PK)*20)); 
	sk_autor = malloc((sizeof(No_PK)*20)); 
	sk_ano = malloc((sizeof(No_PK)*20)); 
	nrr = fopen ( "nrr.dat" , "rb" );  /* abre o arquivo que contem as chaves primarias */
	if (nrr) { 
		fseek (nrr, 0 ,SEEK_END); /* Nrr existe! procura o seu tamanho total */
		lSize = ftell (nrr); 
		rewind (nrr); /*volta para o inicio */
		titulo = (char*) malloc (sizeof(char)*(tam_titulo+1));
		indice = (char*) malloc (sizeof(char)*5);
		for(i=1;i<=lSize/(tam_titulo+4);i++) {   /* faz a insercao dos dados do arquivos com o loop */
			result = fread (titulo,1,(tam_titulo),nrr); 
			fseek (nrr, ((tam_titulo+4)*i-4) ,SEEK_SET); /* recebe o titulo e o indice da obra */
			result = fread (indice,1,4,nrr);
			tamanho = Le_PK(&obras,titulo,atoi(indice),tamanho,tam_titulo); /* adiciona um por um no vetor "obras" */
			fseek (nrr, ((tam_titulo+4)*i) ,SEEK_SET); /* espera no comeco do proximo titulo */
			qsort (obras, tamanho, sizeof (No_PK), compara); /* ordena o vetor */
		}
		fclose(nrr);
		free(titulo); /* libera os parametros */
		free(indice);	
	} 
	else { 				/* Nrr nao existe! */
		base = fopen ("base25.dat","r");
		pk_titulo = fopen ("pk_titulo.dat","w");
		pk_tipo = fopen("pk_tipo.dat","w");
		pk_autor = fopen ("pk_autor.dat","w");
		pk_ano = fopen("pk_ano.dat","w");
		if(base) {                    /* verifica se base25.dat ja existe, se nao existe, nao faz nada */
			fseek (base, 0 ,SEEK_END);
			lSize = ftell (base); /* recebe o tamanho total da base */
			rewind (base);			/* se base existe, adiciona-se os titulos na memoria diretamente */
			buffer = (char*) malloc (sizeof(char)*(tam_titulo+1));  /* comeca com nrr = 1 e vai até o fim da qtdade de titulos da  base*/
			for(i=1;i<=lSize/tam_total;i++) { 
				atual = Secondary(&sk_titulo, base, pk_titulo , tam_titulo, &ititulo, atual, &ttitulo);
			/*	atual = Secondary(&sk_tipo, base, pk_tipo , tam_tipo, &itipo, atual, &ttipo);
				atual = Secondary(&sk_autor, base, pk_autor , tam_autor, &iautor, atual, &tautor);
				/*atual = Secondary(&sk_ano, base, pk_ano , tam_ano, &iano, atual, &tamanho);*/
				result = fread (buffer,1,(tam_titulo+1),base);	/* recebe o titulo e o indice da obra */
				tamanho = Le_PK(&obras,buffer,i,tamanho,tam_titulo);
				qsort (obras, tamanho, sizeof (No_PK), compara);
				
				fseek (base, (tam_total*i) ,SEEK_SET);
				atual = tam_total*i;
			}
			fclose(base);
			free(buffer);
		}
	}
	while (n != 3) {  /* inicio da interface com o usuario, mantem loop enquanto n diferente de 3 */  
		printf("**********************************************\n**********************************************\n**                                          **\n         1 - Adicionar novo titulo\n         2 - Realizar consultas\n         3 - Sair\n**                                          **\n**********************************************\n**********************************************\n");
		scanf("%d", &n);
		__fpurge(stdin);
		switch(n) {
			case 1:
				base = fopen ("base25.dat", "a");
				Titulo(obras,tit,base,tamanho); /* adiciona um novo titulo */
				Tipo(base);
				Autor(base);
				Ano(base);
				Valor(base);
				Imagem(base);
				tamanho = Le_PK(&obras,tit,i,tamanho, tam_titulo); /* adiciona esse novo titulo e seu nrr (o proximo i) na memoria */
				qsort (obras, tamanho, sizeof (No_PK), compara);
				i = i + 1;  /* atualiza o indicador de nrr */
				printf("\nAdicionado a Base de Dados!\n\n");
				fclose(base);
				break;
			case 2:
				menu_consulta(obras, tamanho); /* entra na secao de consulta */
				break;
			case 3:
				break;
			default:
				printf("Opcao invalida\n");
				break;	
		}
	}
	printf("Encerrando programa.\n");
	nrr = fopen ( "nrr.dat" , "w" ); 
	sk = fopen ( "sk_titulo.dat" , "w" ); 		/* processo para reescrever o arquivo nrr.dat no disco com os dados atualizados */
	for(i=0;i<tamanho;i++) {
		fputs(obras[i].titulo,nrr);  /* varre todo o vetor e adiciona no nrr.dat */
		fprintf(nrr, "%.4d", obras[i].nrr);
	}
	for(i=0;i<ttitulo;i++) {
		printf("%s",sk_titulo[i].titulo);
		printf(" %d\n",sk_titulo[i].nrr);
		fputs(sk_titulo[i].titulo,sk);  /* varre todo o vetor e adiciona no nrr.dat */
		fprintf(sk, "%.4d", sk_titulo[i].nrr);
	}
	/*for(i=0;i<tautor;i++) {
		fputs(sk_autor[i].titulo,sk);  /* varre todo o vetor e adiciona no nrr.dat 
		fprintf(sk, "%.4d", sk_autor[i].nrr);*/
	
	free(obras);
	fclose(nrr);  /*Libera os parametros */
	return 0;
}

